/**
 * @description: 采用参数归一化方式--格式化日期
 * @param {Date} date
 * @param {Function|String} formatter String类型{'date'|'datetime'}两种选项 例如 date：2023-04-14  datetime：2023-04-14 22:00:00
 * @param {*} isPad 格式化日期是否补 0
 * @function _formatNormalize 辅助函数实现将formatter转化为函数
 * @return {*}
 * @example 
 * 1. formate(new Date(), 'date', true) // 2023-04-14
 * 2. formate(new Date(), 'datetime', true) // 2023-04-14 22:27:36
 * 3. formate(new Date(), 'yyyy年MM月dd日 HH:mm:ss.ms', true) // 2023年04月14日 22:27:36.058
 * 4. // 3年前
      formate(new Date('2020/04/14'), (dateInfo) => {
        const { year } = dateInfo
        const thisYear = new Date().getFullYear()
        if (year < thisYear) {
          return `${thisYear - year}年前`
        } else if (year > thisYear) {
          return `${year - thisYear}年后`
        } else {
          return '今年'
        }
      })
 * @author: Black
 */
export function formate(date, formatter, isPad = false) {
  // 辅助函数
  function _formatNormalize(formatter, isPad) {
    if (typeof formatter === 'function') {
      return formatter
    }
    if (typeof formatter !== 'string') {
      throw new TypeError('formatter must be a string')
    }
    if (formatter === 'date') {
      formatter = 'yyyy-MM-dd'
    } else if (formatter === 'datetime') {
      formatter = 'yyyy-MM-dd HH:mm:ss'
    }
    const formatterFuc = (dateInfo) => {
      const { yyyy, MM, dd, HH, mm, ss, ms } = dateInfo
      return formatter.replaceAll('yyyy', yyyy)
        .replaceAll('MM', MM)
        .replaceAll('dd', dd)
        .replaceAll('HH', HH)
        .replaceAll('mm', mm)
        .replaceAll('ss', ss)
        .replaceAll('ms', ms)
    }
    return formatterFuc
  }
  // 将 formatter 全部转化为了函数
  formatter = _formatNormalize(formatter)

  const dateInfo = {
    year: date.getFullYear(),
    month: date.getMonth() + 1,
    date: date.getDate(),
    hour: date.getHours(),
    minute: date.getMinutes(),
    second: date.getSeconds(),
    miniSecond: date.getMilliseconds()
  }

  dateInfo.yyyy = dateInfo.year.toString()
  dateInfo.MM = dateInfo.month.toString()
  dateInfo.dd = dateInfo.date.toString()
  dateInfo.HH = dateInfo.hour.toString()
  dateInfo.mm = dateInfo.minute.toString()
  dateInfo.ss = dateInfo.second.toString()
  dateInfo.ms = dateInfo.miniSecond.toString()

  function _pad(prop, len) {
    dateInfo[prop] = dateInfo[prop].padStart(len, '0')
  }

  if (isPad) {
    _pad('yyyy', 4)
    _pad('MM', 2)
    _pad('dd', 2)
    _pad('HH', 2)
    _pad('mm', 2)
    _pad('ss', 2)
    _pad('ms', 3)
  }

  // 此时dateInfo传参进入formatter函数(即formatterFuc函数)
  const result = formatter(dateInfo)
  // console.log(result)
  return result
}

export function getCurrentTime() {

}